package day_8_13;

public class Main1 {
    public List<String> fullJustify(String[] words, int maxWidth) {
        List<String> ret = new ArrayList<>();
        int n = words.length;
        List<String> list = new ArrayList<>();
        for(int i = 0;i < n;) {
            // list 里面是当前行的所有 word
            list.clear(); // 每次将上一行的单词清空
            list.add(words[i]);
            // 统计当前行可以存放多少个单词 和 每两个单词之间的 空格 个数
            int cur = words[i++].length(); // 将当前第一个存放的单词的长度计数
            // 判断的是，前面所有的单词 + 一个空格 + 下一个单词 的总长度
            // 比如案例一中的第一行：cur存放的就是这个长度 [This is an]
            while(i < n && cur + 1 + words[i].length() <= maxWidth) {
                cur += 1 + words[i].length();
                list.add(words[i++]);
            }

            // 特殊判断，如果是最后一行
            if(i == n) {
                // 这个时候所有单词都判断结束，那么i就是到达n这个位置，说明当前行为最后一行
                StringBuilder sb = new StringBuilder(list.get(0)); // 把第一个单词放入 字符串中
                for(int k = 1;k < list.size();k++) {
                    sb.append(" ").append(list.get(k));
                }
                while(sb.length() < maxWidth) {
                    sb.append(" ");
                }
                ret.add(sb.toString());
                break;
            }

            // 如果当前行只有一个单词的话，进行特殊判断为左对齐
            int count = list.size();
            if(count == 1) {
                StringBuilder sb = new StringBuilder(list.get(0));
                while(sb.length() != maxWidth) {
                    sb.append(" ");
                }
                ret.add(sb.toString());
                // 这里不确定是哪行，继续进行判断
                continue;
            }

            // 剩下的就是一般情况下
            int wordWidth = cur - (count - 1); // 当前行单词总长度
            int spaceWidth = maxWidth - wordWidth; // 当前行空格总长度
            int spaceItemWidth = spaceWidth / (count - 1); // 每一个单词和单词之间的空格个数
            StringBuilder spaceItem = new StringBuilder();
            for(int k = 0;k < spaceItemWidth;k++) {
                spaceItem.append(" ");
            }
            StringBuilder sb = new StringBuilder();
            for(int k = 0,sum = 0;k < count;k++) {
                sb.append(list.get(k));
                // 判断是否是当前行的最后一个单词
                if(k == count - 1) {
                    break;
                }
                sb.append(spaceItem);
                sum += spaceItemWidth;
                // 剩余放入空格的次数
                int x = count - k - 1 - 1;
                // 剩余间隙数量 * 最小单位空格长度 + 当前空格长度 < 单词总长度，则在当前间隙多补充一个空格
                if(x * spaceItemWidth + sum < spaceWidth) {
                    sb.append(" ");
                    sum++;
                }
            }
            ret.add(sb.toString());
        }
        return ret;
    }
}
